package per.hx.bs.util;

import per.hx.bs.base.domain.Tree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author HuXing
 * @date 2018/3/21  22:33
 * 构建树形结构
 */
public class BuildTree {

    public static <T> Tree<T> build(List<Tree<T>> nodes, String topName) {
        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();
        for (Tree<T> children : nodes) {
            String pid = children.getParentId();
            if (pid == null || "0".equals(pid)) {
                topNodes.add(children);
                continue;
            }
            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    if (parent.getChildren() == null) {
                        List<Tree<T>> child = new ArrayList<Tree<T>>();
                        parent.setChildren(child);
                    }
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);
                }
            }
        }
        Tree<T> root = new Tree<T>();
        if (topNodes.size() == 1) {
            root = topNodes.get(0);
        } else {
            root.setId("-1");
            root.setParentId("");
            root.setHasParent(false);
            root.setChildren(true);
            root.setChecked(true);
            root.setChildren(topNodes);
            if (topName != null) {
                root.setText(topName);
            } else {
                root.setText("选择学院");
            }
            Map<String, Object> state = new HashMap<String, Object>(1);
            state.put("opened", true);
            root.setState(state);
        }
        return root;
    }

    public static <T> List<Tree<T>> buildList(List<Tree<T>> nodes, String idParam) {
        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();
        for (Tree<T> children : nodes) {
            String pid = children.getParentId();
            if (pid == null || idParam.equals(pid)) {
                topNodes.add(children);
                continue;
            }
            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    if (parent.getChildren() == null) {
                        List<Tree<T>> child = new ArrayList<Tree<T>>();
                        parent.setChildren(child);
                    }
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);
                }
            }
        }
        return topNodes;
    }

}
